Coupling and Cohesion
Coupling describes how strongly one component depends on other components, while cohesion describes how closely the responsibilities within a component belong together. Good object-oriented architecture generally aims for high cohesion within modules and appropriately low coupling between modules. The goal is not zero coupling; some dependency is necessary. The architectural objective is to make dependencies intentional, stable and easy to change.
High cohesion means a component has closely related responsibilities.
Low coupling means fewer or more stable dependencies between components.
High cohesion often makes components easier to understand and test.
Low coupling makes changes less likely to ripple through the system.
Use dependency inversion and composition to control coupling.
Avoid optimizing for low coupling at the expense of a fragmented design.